#include <sstream>
#include <fstream>
#include <iostream>
#include <string>
#include <string.h>
using namespace std;

class Complex{
public:
    // 构造函数
    Complex(const char * str)
    :_str(new char[strlen(str) + 1]())
    {  
        strcpy(_str, str);
    }

    
    // 析构函数
    // 因为使用的是string类型了，申请了堆空间，所以要自己重写析构函数
    ~Complex(){
        if(_str){
            delete [] _str;
            _str = nullptr;
        }
    }

    // 重写了析构就要重写拷贝构造函数和赋值运算
    // 拷贝构造函数
    Complex(const Complex & rhs)
    :_str(new char[strlen(rhs._str) + 1]())
    {
        strcpy(_str, rhs._str);
    }

    // 赋值运算
    Complex & operator=(const Complex & rhs){
        if(this != &rhs){
            delete [] _str;
            _str = new char[strlen(rhs._str)+ 1]();
            strcpy(_str, rhs._str);
        }
        return *this;
    }

    // 因为是数组元素，所以要知道他的长度
    // 注意这里是字符内容的长度不是数组的长度，用size不一定准确
    int size() const{
        return strlen(_str);
    }

    // 重载 [] 
    // operator[]()
    // friend operator[] 必须是非静态成员函数不能使用friend有元方式实现
    // 只可以把operator[]用成员函数的方式重载
    char & operator[](int indx){
        if(indx < size()){
            return _str[indx];
            //return *(_str + indx);
        }else{
            // 函数成员越界
            // 输出一个结束终止符
            static char nullchar = '\0';
            return nullchar;
        }     
    }

private:
    char * _str;
};

void test(){
    Complex str("hello,word!");
    str[2];
    cout << str[2] << endl;

}

int main(int atgc, char * argv[])
{
    test();
    return 0;
}

